# 作者: YWH
# 2025年01月03日10时14分02秒
# 981474892@qq.com
import copy

def use_list_copy():
    """
    复制一个列表，修改复制后的列表，原列表不变
    """
    a = [1, 2, 3]
    b = a.copy()
    b[0] = 10
    print(a)
    print(b)


def use_copy():
    """
    注意和下边的进行对照

    """
    c = [1, 2, 3]
    d = copy.copy(c)
    d[0] = 10
    print(id(c))
    print(id(d))
    print(c)
    print(d)




def use_copy2():
    """
    浅copy
d = copy.copy(c) 只会复制 c 的外层结构，d 还是包含 a 和 b 的列表，但 a 和 b 本身并没有被复制，
它们仍然是指向原始 a 和 b 的引用。 a[0] = 10 时，实际上修改的是 c 和 d 中指向 a 的引用，因为 c 和 d 都指向同一个 a 列表。
由于 a 是共享的（在 c 和 d 中都引用了相同的 a），所以当 a 被修改后，c 和 d 中的 a 都会反映出这个变化。
    """
    a=[1,2]
    b=[3,4]
    c=[a,b]
    d=copy.copy(c)
    print(d)
    print(c)
    # print(id(c))
    # print(id(d))
    print('-'*50)
    a[0]=10
    print(c)
    print(d)

def use_deepcopy():
    """
    递归去copy，不管有多少层，都会创建一个全新的空间来存数据
    """
    a = [1, 2]
    b = [3, 4]
    c = [a, b]
    d = copy.deepcopy(c)
    # print(id(c))#可以证明创建的这两个不是同一个东西，
    # print(id(d))
    a[0] = 10
    print(f'c--{c}')
    print(f'd--{d}')
    print('-' * 50)
    print(id(c[0]), id(c[1]))
    print(id(d[0]), id(d[1]))

class Pet:
    def __init__(self,name,grade):
        self.name = name
        self.grade = grade
        self.skill=['量子绝灭波']

def use_copy_skill():
    """
    一个例子来说明深copy
    """
    cassius=Pet("卡修斯",81)
    up_cassius=copy.deepcopy(cassius)
    up_cassius.grade=100
    up_cassius.skill.append("万仞崩山破")
    print(cassius.skill)
    print(up_cassius.skill)


if __name__ == '__main__':
    # use_copy2()
    print("--"*50)
    # use_list_copy()
    # use_copy()
    # use_deepcopy()
    use_copy_skill()